function Person() {

}
// 虽然写在注释里，但是你要注意：
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

// Person是构造函数    Person.prototype是实例原型


// __proto__
// 这是每一个JavaScript对象(除了 null )都具有的一个属性，叫__proto__，这个属性会指向该对象的原型。
console.log(person.__proto__ === Person.prototype); // true



// 既然实例对象和构造函数都可以指向原型，那么原型是否有属性指向构造函数或者实例呢？
// 指向实例倒是没有，因为一个构造函数可以生成多个实例，但是原型指向构造函数倒是有的
console.log(Person === Person.prototype.constructor); // true




// 实例与原型
// 当读取实例的属性时，如果找不到，就会查找与对象关联的原型中的属性，如果还查不到，就去找原型的原型，一直找到最顶层为止。





// 那 Object.prototype 的原型呢？
// null 表示“没有对象”，即该处不应该有值。
// 所以 Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型，其实表达了一个意思。
// 看自己的理解了   



// 最后，补充三点大家可能不会注意的地方：
// constructor
function Person() {

}
var person = new Person();
console.log(person.constructor === Person); // true

// 当获取 person.constructor 时，其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时，会从 person 的原型也就是 Person.prototype 中读取，正好原型中有该属性，所以：

// __proto__
// 其次是 __proto__ ，绝大部分浏览器都支持这个非标准的方法访问原型，然而它并不存在于 Person.prototype 中，实际上，它是来自于 Object.prototype ，与其说是一个属性，不如说是一个 getter/setter，当使用 obj.__proto__ 时，可以理解成返回了 Object.getPrototypeOf(obj)。


// 真的是继承吗？
// 继承意味着复制操作，然而 JavaScript 默认并不会复制对象的属性，相反，JavaScript 只是在两个对象之间创建一个关联，这样，一个对象就可以通过委托访问另一个对象的属性和函数，所以与其叫继承，委托的说法反而更准确些。